Function.prototype.yzapply = function(thisArg, argArray) {
  // 1.获取要执行的函数
  var fn = this
  // 2.处理绑定的thisArg
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
  // 3.执行函数
  thisArg.fn = fn
  var result
  // if(!argArray) {
  //   result = thisArg.fn()
  // } else {
  //   result = thisArg.fn(...argArray)
  // }
  // 有值就用值，无值用空数组
  argArray = argArray ? argArray : []
  result = thisArg.fn(...argArray)
  delete thisArg.fn
  return result
}


function sum(num1, num2) {
  console.log("sum", num1 + num2)
  return num1 + num2
}

function foo(num) {
  return num
}

function bar() {
  console.log("barbarbar")
}

// 系统调用
var result = sum.apply("aaa", [20, 30])
console.log(result)

// 自己实现调用
var result2 = foo.yzapply("aaa", [20])
console.log(result2)

bar.yzapply("bbb")
